Date		:	7 ET 8 NOVEMBRE 1991
		Protection	:	MOT DE PASSE
		Programme	:       GREAT COURTS II
		Outils		:	SOFT-ICE V2.50
		Fichier		:	VGA.DAT + GC2FS.COM
		Temps pass�	:	1 HEURE 30
		Soci�t�		:	UBI SOFT
		Divers	        :	O� je me fais avoir en beaut�.
		Origine		:	?
		Num�ro		:	148

	
	Une demande de mot de passe qui est constamment renouvel�e tant que
	l'on n'a pas entr� les quatre bons caract�res.
	�a peut durer longtemps.
	Les caract�res sont demand�s par l'interm�diaire de l'INT 16 sous-
	fonction 00.
	En bricolant un peu par ci par l� on trouve un RET que le soft ignore
	superbement s'acharnant � vouloir passer ailleurs.
	Je le force ( premier patch ) ce qui me fait tomber sur quelque chose
	de connu, une position m�moire que l'on remet � z�ro dans un cas et 
	pas dans l'autre: ( c'est du flair c'est tout )

	CS=0FF5
	CS:4933 E86100		CALL	4997
	CS:4936 0BC0		OR	AX,AX
	CS:4938 7807		JS	4941	; SAUTE SI MAUVAISE REPONSE.
	CS:493A C70619250000	MOV	WORD PTR [2519],0000
	CS:4940 C3		RET
	
	En pla�ant deux NOP � la place du JS 4941 le jeu tourne. ( de plus
	aucun fichier n'est crypt� et l'on trouve toutes ces cha�nes dans
	le fichier VGA.DAT ).
	Voil� me direz-vous il ne suffit plus que de faire un patch pour le
	premier saut rencontrer au d�but. 
	Et c'est l� que cela se corse car en modifiant le saut en question
	le jeu se trouve �tre pris de folie en clignotant d'un menu � l'autre !
	Le saut en question suit une instruction TEST de la position 2B6D avec
	FF. Comme j'ai toujours z�ro en 2B6D mon JNZ qui suit s'ex�cute mal.
	( c'est le moins que l'on puisse dire ).
	De plus je m'aper�ois avec SOFT-ICE que je repasse par ce saut plus
	tard une fois la demande du code pass�e ce qui explique que mon
	programme ne se d�roule plus correctement.
	Ci-dessous la routine en question:

	CS=0FF5
	CS:6674 E83C09		CALL	6FB3
	CS:6677 F6066D2BFFF	TEST	BYTE PTR [2B6D],FF
	CS:667C 752A		JNZ	66A8	; SAUT FATIDIQUE....
	
	ACTIONS ET RESULTATS:

	INVERSION DU SAUT JNZ 66A8 EN JZ 66A8.............. --> JEU SE PLANTE.
	INVERSION DU FLAG Z................................ --> IDEM.
	ECRITURE D'UNE VALEUR DIFFERENTE DE ZERO EN [2B6D]. --> CA MARCHE.
	REMPLACER L'INSTRUCTION TEST PAR < MOV [2B6D],FF >. --> CA PLANTE.
	
	L'id�e vient d'essayer de trouver � quel moment le programme �crit 00
	en [2B6D] et de modifier l'instruction. ( �a c'est g�nial )
	Premi�re constatation : le programme de test du code n'�crit JAMAIS
	dans cette position !
	Donc - restons calme - c'est que cette position est initialis�e au
	chargement du jeu, cela signifie ( avec un peu de chance ) que SOFT-
	ICE devrait me trouver l'instruction ( ou la boucle ) qui �crit � cet
	endroit.
	Un point d'arr�t du type  < BPMB 1E69:2B6D W > est pos�.
	Pourquoi 1E69 ? Parceque DS est �gal � cette valeur au moment de
	l'appel tout simplement.
	Je relance tout et SOFT-ICE s'affiche imm�diatement. Je me trouve dans
	une boucle qui me remet toute la zone m�moire autour de 2B6D � z�ro
	� l'aide d'une instruction INSW. Las, cela ne figure donc pas dans le
	fichier, c'aurait �t� trop simple.
	INSW avez-vous dit ? 
	Dans ce cas rien est perdu car c'est une instruction 80286/80386.
	Cela signifie que je me trouve dans le BIOS et que le programme n'est
	pas encore charg�. Car il faut savoir que les auteurs de logiciel sont
	obliger de programmer en utilisant le jeu d'instructions du PC XT
	autrement dit du 8088 pour que le jeu tourne sur toute les machines.
	( compatibilit� ascendante )
	Je relance donc SOFT-ICE par x et cette fois ci je m'arr�te dans mon
	programme avec une superbe instruction MOV BYTE PTR [2B6D],00.
	Je m'empresse de la transformer en MOV BYTE PTR [2B6D],01 et je relance
	mon soft... qui se plante toujours ! 
	Avec SOFT-ICE je contr�le le contenu de la position 2B6D qui est �gale
	� ZERO ! Que signifie-ce ?
	Je place des points d'arr�ts partout pour pouvoir suivre le contenu de
	2B6D et je m'aper�ois que le programme au niveau de la demande du code
	r��crit ZERO dans cette position: c'est � devenir fou.
	J'en ai marre: j'applique la soluce muscl�e c.a.d. d�tournement d'INT
	par un programme p�re. Le d�tournement d'INT en TSR me pose trop de
	probl�mes.
	Un point d'arr�t sur l'INT 16 sous-fonction 00 est plac� pour s'assurer
	que cette interruption n'est appel�e qu'� l'endroit de la demande du
	code et nul part ailleurs.
	Et on modifie un de mes pr�c�dents PATCH.ASM:
 	
	 

	
  ; 	PATCH POUR LE PROGRAMME GREAT COURTS II.
  ;	DETOURNEMENT DE L'INT 16 SOUS-FONCTION 00.
  ;	Il s'agit juste de mettre quelque chose dans la position m�moire 2B6D.
  ;     8 NOVEMBRE 1991.

  adr_ip	equ	2b6dh
  seg_a 	segment	byte public
     
		assume	cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a
  
		org	100h

  sto		proc	far

  start:
		jmp	init		; r�duire la m�moire et d�placer la 
		db	90h		; pile plus pr�s.

  nom_prg	db	'gc2.exe',0,0,0,0,0,0	; 12 car max + nul
  paramet	dw	0		; M�me bloc d'environnement.		
  ENVIR		dw	0		; Les param�tres de la ligne de 
  data_3	dw	0		; commande sont recopi�s ici puis
  FCB_1		dw	0		; transmis au programme fils. ( 80h )
  data_5	dw	0		; "LOAD /U EGA 1"
  FCB_2 	dw	0
  data_7	dw	0
  sauve_SP	dw	0
  sauve_SS	dw	0
  data_9	dw	0, 0
  drap          equ     0

  ;------------------------------ PROGRAMME PERE ------------------------------

  loc_1:	mov     sauve_SP,sp
		mov     sauve_SS,ss
		mov	ax,80h
		mov	ENVIR,ax	; Ligne de commande...
		mov	data_3,ds
		mov	ax,5Ch		; Premier FCB ( inutilis� )
		mov	FCB_1,ax
		mov	data_5,ds
		mov	ax,6Ch		; Second FCB ( inutilis� )
		mov	FCB_2,ax
		mov	data_7,ds
		mov	ah,35h	
		mov	al,16h
		int	21h		; DOS Services  ah=function 35h
					;  get intrpt vector al in es:bx
		mov	cs:data_9,bx
		mov	word ptr cs:data_9+2,es
		mov	ah,25h		
		mov	al,16h		
		lea	dx,cs:[int16]	; Load effective addr
		int	21h		; DOS Services  ah=function 25h
					;  set intrpt vector al to ds:dx
		lea	dx,cs:[nom_prg]	; Load effective addr
		push	ds
		pop	es
		lea	bx,cs:[paramet]	; Load effective addr
		mov	al,0
		mov	ah,4Bh		
		int	21h		; Appel du programme fils.
					; run progm @ds:dx, parm @es:bx
		mov	sp,sauve_SP	
		mov	ss,sauve_SS	
		mov	ah,25h	
		mov	al,16h	
		mov	dx,cs:data_9
		mov	ds,word ptr cs:data_9+2
		int	21h		;  set intrpt vector al to ds:dx
		mov     ah,4dh
		int     21h
		mov	ah,4Ch
		int	21h		;  terminate with al=return code
  sto		endp

  ;---------------------------- int 16 d�tourn�e -----------------------------

  int_16h_entry	proc	far
  int16:	push	ax
		push    ds
		push    bp
	        push    cx
		pushf			
		cmp     byte ptr ds:[drap],1	; Je regarde si c'est fait.
		jz      loc_2
		cmp	ah,0			; Sous- fonction 00
		jne	loc_2			; Jump if not equal
		mov     byte ptr ds:[adr_ip],1  ; on place '1' dans DS:2B6D
                mov     byte ptr ds:[drap],1	; On y revient plus.
  loc_2:	popf	
		pop     cx
	        pop     bp
		pop     ds			
		pop	ax
		jmp	dword ptr cs:data_9
  int_16h_entry	endp

  ;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------

  init:         mov ah,4ah		
		mov bx,offset fin   ; Fin du programme en BX.
		mov cl,4	    ; Divis� par 4 pour avoir des paragraphes.	
		shr bx,cl
		inc bx		    ; On en rajoute un par s�curit�.	
		int 21h		    ; Execution de la fonction 4Ah.
		mov sp,offset fin   ; on d�place la pile en "fin" car elle est
		jmp loc_1           ; plac�e en FFFE dans un programme COM.

  fin_init      label near

  ;----------------------- PLACE RESERVEE POUR LA PILE ------------------------

		dw (256-((fin_init-init) shr 1)) dup (?)
  fin           equ this byte	    ; ici le sommet de la pile, SP
		db 35 dup (?)                              
		db 'Please no more codewheel nor password, why bother ?'
		db 125 dup (?)
		db 'FREDDY_SOFT'
  seg_a		ends
		end	start

	17 Novembre 1991

	Ou je m'aper�ois en lan�ant le soft sans la routine de d�tournement
	que l'on peut passer le code simplement en tapant ESC !
	Mais la seconde modification est obligatoire: avec PCTOOLS chercher 
	0BC07807 et modifier 7807 par 9090.

	30 septembre 1992

	O� pr�s d'un an apr�s pensant avoir perdu ce DEP je le recraque pour
	d�couvrir des choses que je n'avais pas vu la premi�re fois. Et comble
	de tout je n'avais pas perdu ce DEP c'est CGII.DEP que j'ai du �cras�
	et non celui-ci: GCII.DEP !
 	Me faisant toujours pi�ger par le fait que j'oublie que c'est la touche
	ESC qui fait sortir de la routine de test, je d�cortique tout en 
	d�cidant de suivre le chemin par o� l'on fait passer les caract�res
	tap�s � l'�cran.
	Ayant trouv� l'endroit o� ils sont stock�s j'y place un point d'arr�t
	en lecture ( car il va bien falloir venir les relire pour les comparer
	� la bonne r�ponse ) et je lance la machine.

	BMPB 33D4:0075 R

	SOFT-ICE r�apparait imm�diatement avec la s�quence suivante:
	
	CS=0E02
	CS:49DB	800441	ADD BYTE PTR [SI],41
	CS:49DE	A6	CMPSB
	CS:49DF	750A	JNZ 49EB	; SI MAUVAIS ON SAUTE ET FFFF -> AX.
	CS:49E1	E2F8	LOOP 49DB	; TANT QUE C'EST BON ON TOURNE.
	CS:49E3	B80000	MOV AX,0000 	; SI OK 0000 -> AX.
	CS:49E6	07	POP ES
	CS:49E7	1F	POP DS
	CS:49E8	5F	POP DI
	CS:49E9	5E	POP SI
	CS:49EA	C3	RET		; ON S'EN VA AVEC LA BONNE REPONSE.
	CS:49EB B8FFFF	MOV AX,FFFF     ; MAUVAISE REPONSE.
	CS:49EE	07	POP ES
	CS:49EF	1F	POP DS	
	CS:49F0 5F	POP DI
	CS:49F1 5E	POP SI
	CS:49F2 C3	RET		; RETOUR AVEC LA MAUVAISE REPONSE.

	Donc on voit qu'il suffit de placer 0000 dans AX avant de quitter par
	le RET.
	Et en passant le RET on se retrouve apr�s le CALL 6631 qui lui en fait
	demande le mot de passe:

    CS=0E02
    CS:492A C706AD2B5449   MOV	WORD PTR [2BAD],4954
    CS:4930 E8FE1C	   CALL	6631	; Demande du mot de passe.
    CS:4933 E86100	   CALL	4997	; Comparaison de la chaine de caract�res
    CS:4936 0BC0	   OR   AX,AX   ; Test ( 0000 ou FFFF dans AX du CALL ).	
    CS:4938 7807	   JS	4941	; SAUT FATIDIQUE....
	
	En suprimant le CALL de la demande du mot de passe ainsi que celui du
	test plus les deux instructions qui suivent on ne voit plus une seule
	trace de la demande du mot de passe en lan�ant le jeu. Et surtout,
	surtout on ne risque plus d'oublier que c'est la touche ESC qui valide 
	le code tap� !
	
	Avec PCTOOLS chercher E8FE1CE861000BC07807 dans le fichier VGA.DAT et
	remplacer le tout par des 90.

	FREDDY